<?php
/**
 * SocialEngine
 *
 * @category   Application_Core
 * @package    Core
 * @copyright  Copyright 2006-2010 Webligo Developments
 * @license    http://www.socialengine.net/license/
 * @version    $Id: RequireSubject.php 7244 2010-09-01 01:49:53Z john $
 * @author     John
 */

/**
 * @category   Application_Core
 * @package    Core
 * @copyright  Copyright 2006-2010 Webligo Developments
 * @license    http://www.socialengine.net/license/
 */
class Core_Controller_Action_Helper_RequireSubject extends
  Core_Controller_Action_Helper_RequireAbstract
{
  protected $_errorAction = array('requiresubject', 'error', 'core');

  protected $_requiredType;

  protected $_actionRequireTypes = array();

  public function direct($type = null)
  {
    if( null !== $type ) {
      $this->setRequiredType($type);
    }
    return parent::direct();
  }

  public function reset()
  {
    parent::reset();
    
    $this->_errorAction = array('requiresubject', 'error', 'core');
    $this->_requiredType = null;
    $this->_actionRequireTypes = array();
    
    return $this;
  }
  
  public function checkRequire()
  {
    try
    {
      $subject = Engine_Api::_()->core()->getSubject();
    }
    catch( Exception $e )
    {
      $subject = null;
    }

    $actionName = $this->getFrontController()->getRequest()->getActionName();
    $ret = true;
    
    if( !($subject instanceof Core_Model_Item_Abstract) || !$subject->getIdentity() )
    {
      $ret = false;
    }

    else if( null !== $this->_requiredType && $subject->getType() != $this->_requiredType )
    {
      $ret = false;
    }

    else if( null !== ($requireType = $this->getActionRequireType($actionName)) &&
        $subject->getType() != $requireType )
    {
      $ret = false;
    }

    if( !$ret && APPLICATION_ENV == 'development' && Zend_Registry::isRegistered('Zend_Log') && ($log = Zend_Registry::get('Zend_Log')) instanceof Zend_Log )
    {
      $target = $this->getRequest()->getModuleName() . '.' .
              $this->getRequest()->getControllerName() . '.' .
              $this->getRequest()->getActionName();
      $log->log('Require class '.get_class($this).' failed check for: '.$target, Zend_Log::DEBUG);
    }

    return $ret;
  }
  
  public function setRequiredType($type = null)
  {
    $this->_requiredType = $type;
    return $this;
  }



  // Action requires
  
  public function setActionRequireTypes(array $data)
  {
    foreach( $data as $key => $value )
    {
      $this->setActionRequireType($key, $value);
    }
    return $this;
  }

  public function setActionRequireType($action, $type = null)
  {
    $this->_actionRequireTypes[$action] = $type;
    $this->addActionRequire($action);
    return $this;
  }

  public function hasActionRequireType($action)
  {
    return ( null !== $this->getActionRequireType($action) );
  }

  public function getActionRequireType($action)
  {
    if( !isset($this->_actionRequireTypes[$action]) )
    {
      return null;
    }
    return $this->_actionRequireTypes[$action];
  }

  public function removeActionRequireType($action)
  {
    unset($this->_actionRequireTypes);
    return $this;
  }
}